package com.lei.springbootpractice.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import jakarta.annotation.PostConstruct;

/**
 * 分类缓存管理器
 * 负责定期刷新分类缓存，确保数据的及时性
 */
@Service
public class CategoryCacheManager {

    private CategoryService categoryService;
    private volatile boolean cacheNeedsRefresh = false;

    // 使用PostConstruct来设置双向引用
    @PostConstruct
    public void init() {
        if (categoryService != null) {
            categoryService.setCacheManager(this);
        }
    }

    @Autowired
    public void setCategoryService(CategoryService categoryService) {
        this.categoryService = categoryService;
    }

    /**
     * 标记缓存需要刷新
     * 当分类数据发生变化时调用此方法
     */
    public void markCacheForRefresh() {
        this.cacheNeedsRefresh = true;
        System.out.println("分类缓存已标记为需要刷新");
    }

    /**
     * 立即刷新缓存
     */
    public void refreshCacheNow() {
        System.out.println("立即刷新分类缓存");
        categoryService.clearCache();
        categoryService.warmUpCache();
        this.cacheNeedsRefresh = false;
    }

    /**
     * 定期检查并刷新缓存
     * 每30秒检查一次，如果有标记则刷新
     */
    @Scheduled(fixedRate = 30000) // 30秒检查一次
    public void scheduledCacheRefresh() {
        if (cacheNeedsRefresh) {
            System.out.println("定期缓存刷新: 检测到缓存需要更新");
            refreshCacheNow();
        }
    }

    /**
     * 定期强制刷新缓存
     * 每5分钟强制刷新一次，确保数据最新
     */
    @Scheduled(fixedRate = 300000) // 5分钟强制刷新一次
    public void forcedCacheRefresh() {
        System.out.println("定期缓存刷新: 强制刷新分类缓存");
        refreshCacheNow();
    }

    /**
     * 检查缓存是否需要刷新
     */
    public boolean isCacheRefreshNeeded() {
        return cacheNeedsRefresh;
    }
} 